package thread;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @description: 银行有一个账户，两个储户进行存钱，共存3000，每次存1000，共存3次
 * 问题分析：
 * 1、是否需要多线程技术：需要，有多个账号
 * 2、是否存在线程安全：多个储户操作同一个账号，这个账号相当于是共享数据，会存在线程安全问题
 * @author: apple
 * @date:  2021/11/28 4:43 下午
 * @version 1.0
 **/
public class AccountTest {

    public static void main(String[] args) {

        // 账户，共享数据，现在只有一份
        Account c = new Account();
        // 创建两个用户，因为要模拟同时操作，所以使用了多线程
        Customer c1 = new Customer(c,"小明");
        Customer c2 = new Customer(c,"小张");
        System.out.println(c1.getC() == c2.getC());
        c1.start();
        c2.start();
    }
}

class Account {

    private int money;

    public Account() {
        money = 0;
    }

    public void saveMoney(int m) {
        money += m;
        System.out.println(Thread.currentThread().getName() + "存钱，当前余额：" + money);
    }
}

class Customer extends Thread {

    // 使用同步锁来实现
    private static final ReentrantLock lock =  new ReentrantLock(true);

    // 富血模型
    private Account c;

    public Customer(Account c , String name) {
        this.c = c;
        super.setName(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            try {
                lock.lock();
                c.saveMoney(1000);
            } finally {
                lock.unlock();
            }
        }

    }

    public Account getC() {
        return c;
    }

}